//
//  ZQNetWorkManager.swift
//  NewWeiBo
//
//  Created by 周周旗 on 2019/3/19.
//  Copyright © 2019 ZQ. All rights reserved.
//

import UIKit
import AFNetworking

enum ZQHTTPMethod {
    case GET
    case POST
}
//AnyObject 可以代表任何 class 类型的实例

//Any 可以表示任意类型，甚至包括方法 (func) 类型


//网络管理工具
class ZQNetWorkManager: AFHTTPSessionManager {
    // 单例
    /// 静态区 /常量 /闭包
    /// 在第一次访问时，执行闭包， 并将结果保存到 shared 常量中
//    static let shared = ZQNetWorkManager()
    static var shared : ZQNetWorkManager{
        //实例化对象
        let instances = ZQNetWorkManager()
        //设置支持反序列化的数据类型
        instances.responseSerializer.acceptableContentTypes?.insert("text/plain")
        return instances
    }
     lazy var userAccount = ZQUserAccount()
    /// isLogin控制是否加载游客视图 ,计算型属性
    var isLogon: Bool{
        return userAccount.access_token != nil
    }
    
    
    /// 专门负责拼接 token 的网络请求
    func tokenRequest(method:ZQHTTPMethod = .GET,URLString: String, parameters: [String: AnyObject]?, completion:@escaping (_ json: AnyObject?, _ isSuccess: Bool)->()){
        //1> 判断 token 是否存在，不存在return
        guard  userAccount.access_token != nil else {
            // FIXME: 发送通知，通知用户登录
            print("没有 token需要登录")
            completion(nil, false)
            return
        }
        //2> 判断 parameters是否存在， 不存在则new
        var parameters = parameters
        if parameters == nil {
            parameters = [String:AnyObject]()
        }
        //3> 拼接token,此处parameters一定有值 ！
        parameters!["access_token"] =  userAccount.access_token as AnyObject
        
        //4> 调用真正的网络请求
        request(method: method,URLString: URLString, parameters: parameters, completion: completion)
    }
    
    /// 使用一个函数封装 AFN 的 GET / POST 请求
    func request(method:ZQHTTPMethod = .GET,URLString: String, parameters: [String: AnyObject]?, completion:@escaping (_ json: AnyObject?, _ isSuccess: Bool)->()) {
        //成功回调
        let success = { (task: URLSessionDataTask, json: Any?)->() in
            completion(json as AnyObject, true)
        }
        //失败回调
        let failure = {(task: URLSessionDataTask?, error: Error)->() in
            if (task?.response as! HTTPURLResponse).statusCode == 403 {
                // FIXME: 发送通知(本方法不知被谁调用，谁接收到通知，谁处理)
            }
            completion(nil, false)
        }
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else{
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
    }
}
